#include <stdio.h>
#include <fcntl.h> 
#include <unistd.h>
#include <termios.h> 
#include <stdlib.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#include "GY39.h"
//6818串口所对应的文件名
#define COM2 "/dev/ttySAC1"
#define COM3 "/dev/ttySAC2"
#define COM4 "/dev/ttySAC3"

//定义命令--->设置模块的工作方式
unsigned char cmd1[3]={0xa5,0x81,0x26};//设置连续光照模式
unsigned char cmd2[3]={0xa5,0x82,0x27};//设置温湿度气压海拔模式
unsigned char cmd3[3]={0xa5,0x83,0x28};//设置两个模式 
/* 设置串口参数（初始化串口） */
void init_tty(int fd)
{    
	//声明设置串口的结构体
	struct termios termios_new;
	//先清空该结构体
	bzero( &termios_new, sizeof(termios_new));
	//	cfmakeraw()设置终端属性，就是设置termios结构中的各个参数。
	cfmakeraw(&termios_new);
	//设置波特率
	//termios_new.c_cflag=(B9600);
	cfsetispeed(&termios_new, B9600);
	cfsetospeed(&termios_new, B9600);
	//CLOCAL和CREAD分别用于本地连接和接受使能，因此，首先要通过位掩码的方式激活这两个选项。    
	termios_new.c_cflag |= CLOCAL | CREAD;
	//通过掩码设置数据位为8位
	termios_new.c_cflag &= ~CSIZE;
	termios_new.c_cflag |= CS8; 
	//设置无奇偶校验
	termios_new.c_cflag &= ~PARENB;
	//一位停止位
	termios_new.c_cflag &= ~CSTOPB;
	tcflush(fd,TCIFLUSH);
	// 可设置接收字符和等待时间，无特殊要求可以将其设置为0
	termios_new.c_cc[VTIME] = 10;
	termios_new.c_cc[VMIN] = 1;
	// 用于清空输入/输出缓冲区
    	tcflush (fd, TCIFLUSH);
	//完成配置后，可以使用以下函数激活串口设置
	if(tcsetattr(fd,TCSANOW,&termios_new) )
		printf("Setting the serial1 failed!\n");

}


void gy39()
{
	int LUX,T,A,E;
	float H;
	unsigned char rbuf1[9];
	unsigned char rbuf2[15];
	
	int fd = open(COM3,O_RDWR);
	if(-1 == fd)
	{
		printf("open feiled!\n");
		return;
	}
		
		//初始化串口
	init_tty(fd);
	
	int ret = write(fd, cmd1, 3);
	if(ret!=3)
	{
		sleep(1);
	}
	
	ret = read(fd,rbuf1,9);
	if(ret != 9)
	{
		sleep(1);
	}
		
		//获取光照强度
	if(rbuf1[0] == 0x5a && rbuf1[1] == 0x5a && rbuf1[2] == 0x15)
	{
		LUX = rbuf1[4]<<24 | rbuf1[5]<<16 | rbuf1[6]<<8 | rbuf1[7];
		LUX = LUX/100;
		printf("LUX = %d\n",LUX);
	}
	
	//切换模式 获取温湿度大气压强海拔
	ret = write(fd, cmd2, 3);
	if(ret!=3)
	{
		sleep(1);
	}
	
	ret = read(fd,rbuf2,15);
	if(ret != 15)
	{
		sleep(1);
	}
		
	if(rbuf2[0] == 0x5a && rbuf2[1] == 0x5a && rbuf2[2] == 0x45)
	{
		//温度
		T = rbuf2[4]<<8 | rbuf2[5];
		T = T/100;
		printf("Temperature = %dC\n",T);
		//后面自己写

		A = rbuf2[6]<<24 | rbuf2[7]<<16 | rbuf2[8]<<8 | rbuf2[9];
		A = A/100;
		printf("Air pressure = %dPa\n",A);
		
		H = rbuf2[10]<<8 | rbuf2[11];
		H = H/100;
		printf("Humidity = %.2f%\n",H);
		
		E = rbuf2[12]<<8 | rbuf2[13];
		E = E/100;
		printf("Elevation = %dm\n",E);
	}
	close(fd);
	return ;
}




